package middleware.activemq.queue;

import com.me.common.util.PropertiesUtil;
import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

/**
 * 2个消费者同时监听：因为 Queue 模式的队列是 P2P（点到点）模式，所以只会被消费一次
 *
 * @author ME
 * @date 2017/7/27
 */
public class QueueListener2 implements MessageListener {

    public static void main(String[] args) {
        // 连接工厂
        ConnectionFactory connectionFactor;
        // 连接
        Connection connection;
        // 会话
        Session session;
        // 消息队列
        Destination destination;
        // 消息消费者
        MessageConsumer messageConsumer;

        // 创建连接工厂
        connectionFactor = new ActiveMQConnectionFactory(PropertiesUtil.BROKER_USERNAME, PropertiesUtil.BROKER_PASSWORD, PropertiesUtil.BROKER_URL);

        try {
            // 创建连接
            connection = connectionFactor.createConnection();
            // 启动
            connection.start();

            // 获得session:
            //  transacted设置为true时：acknowledgeMode的值忽略，
            //  acknowledgment mode被jms服务器设置为SESSION_TRANSACTED (表示Session启用了事务)。
            session = connection.createSession(true, Session.CLIENT_ACKNOWLEDGE);

            // 创建消息队列
            destination = session.createQueue("QueueWorld");
            // 创建消费者
            messageConsumer = session.createConsumer(destination);
            // 监听消息队列
            messageConsumer.setMessageListener(new QueueListener2());

        } catch (JMSException e) {
            e.printStackTrace();
        }

        System.out.println("\"Queue2\"启动完毕，开始监听。。\n");
    }

    public void onMessage(Message message) {
        // TextMessage/MapMessage/文件/对象/BytesMessage
        if (message instanceof TextMessage) {
            TextMessage textMessage = (TextMessage) message;
            if (textMessage != null) {
                try {
                    System.out.println("QueueListener2收到的消息: " + textMessage.getText());
                    // message.acknowledge();
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}
